// 函数声明
// 定义函数的类型：就是定义函数的参数类型和返回值类型
function fn1(x: number, y: number): number {
	return x + y;
}

fn1(1, 2);

// 函数表达式
// 定义右边函数的类型，左边变量fn2是通过类型推论推导出来的类型
const fn2 = (x: number, y: number): number => {
	return x + y;
};

const fn3: (x: number, y: number) => number = (x, y) => {
	return x + y;
};

// 用接口定义函数类型
interface Fn4 {
	(x: number, y: number): number;
}

const fn4: Fn4 = (x, y) => {
	return x + y;
};

// 可选参数
// 可选参数必须写在最后面
const fn5 = (x: number, y: number, z?: number): number => {
	let result: number = x + y;

	if (z) {
		result = result + z;
	}

	return result;
};

fn5(1, 2, 3);

// 参数默认值, 这个参数就是一个可选参数
const fn6 = (x: number, y: number, z: number = 10): number => {
	let result: number = x + y;

	if (z) {
		result = result + z;
	}

	return result;
};

fn6(1, 2);

// 剩下所有参数
const fn7 = (x: number, y: number, ...args: number[]): void => {
	console.log(x, y, args);
};
fn7(1, 2, 3, 4, 5);

// 反转

// 函数重载
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string | void {
	if (typeof x === "number") {
		return Number(x.toString().split("").reverse().join(""));
	} else if (typeof x === "string") {
		return x.split("").reverse().join("");
	}
}

reverse(123);
reverse("123");

// 接口重载
// 合并成一个接口
interface Person {
	name: string;
}
interface Person {
	age: number;
	// 定义对象中方法的类型
	setAge(age: number): number;
}

const p: Person = {
	name: "jack",
	age: 18,
	setAge(age) {
		return age;
	},
};
